查看原文
其他

redis学习记录

2016-03-04 IT哈哈

 

noSQL适用场景

1.      对数据高并发读写

2.      对海量数据的高效存储和访问

3.      对数据的高可扩展和高可用性

redis适用场合:

目前全球最大的redis用户新浪微博

1.      取最新N个数据的操作

2.      排行榜应用,取TOP N操作

3.      需要精确设定过期时间的应用

4.      计数器应用

5.      Uniq操作,获取某段时间所有数据排重值

6.      实时系统,反垃圾系统

7.      Pub/Sub构建实时消息系统

8.      构建队列系统

9.      缓存


 

redismysqlmogodb

集合
行/列字段


Redis安装:

步骤一:

下载安装包:

http://redis.googlecode.com/files/redis-2.4.17.tar.gz

步骤二:

编译源代码:

tar zxvfredis-2.4.17.tar.gz

cd redis-2.4.17

make

cd src&& make install

步骤三:

移动文件,便于管理:

mkdir –p /usr/local/redis/bin

mkdir –p /usr.local/redis/etc

mv /djh/redis-2.4.17/redis.conf /usr/local/redis/etc

cd /djh/redis-2.4.17/src

mv mkreleasehdr.sh redis-benchmark redis-check-aof  redis-check-dump  redis-cli redis-server   /usr/local/redis/bin

步骤四:

启动redis服务:

/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

Redis服务端的默认端口是6379

默认情况下,redis不是在后台运行的,需要开启redis的后台运行。

vi /usr/local/redis/redis.conf

daemonize值改为yes

步骤五:

客户端连接:

/usr/local/redis/bin/redis-cli

步骤六:

停止redis

/usr/local/redis/bin/redis-cli shutdown

pkill redis-server


 

Redis配置:

daemonize  如果需要在后台运行,把该项改为yes

pifile 配置多个pid的地址,默认在/var/run/redis.pid

bind  绑定ip,设置后只接受来自该IP的请求

port 监听端口,默认6379

timeout 设置客户端连接时的超时时间,单位为秒

loglevel 分级4级,debug,verbose,notice,warning

logfile  配置log文件地址

databases  设置数据库的个数,默认使用的数据库为0

save  设置redis进行数据库镜像的频率

rdbcompression   在镜像备份时,是否进行压缩

dbfilename  镜像备份文件的文件名

dir    数据库镜像备份的文件存放位置

slaceof   设置数据库为其它数据库的从数据库

masterauth  主数据库连接需要的密码验证

requirepass   设置登录时需要使用的密码

maxclients  限制同时连接的客户端数量

maxmemory  设置redis能够使用的最大内存

appendonly  开启append only 模式

appendfsync   设置对appendonly.aof文件同步频率

vm-enabled  是否开启虚拟内存支持

vm-swap-file   设置虚拟内存的交换文件路劲

vm-max-memory   设置redis使用的最大物理内存大小

vm-page-size   设置虚拟内存的叶大小

vm-pages  设置交换文件总的page数量

vm-max-threads   设置VMIO同时使用的线程数量

glueoutputbuf   把小的输出缓存存放在一起

hash-max-zipmap-entries   设置hash的临界值

activerehashing   重新hash

Redis数据类型

String类型

String类型及操作:

String是最简单的类型,一个key对应一个value,string类型是二进制安全的。Redisstring可以包含任何数据,比如JPG图片或者序列化对象。

Set

设置key对应的值为string类型的value

例如:添加一个name=lijie的键值对

set name lijies

setnx

设置key对应的值为string类型的value,如果key已经存在,返回0nxnot exist的意思。

setex

设置key对应的值为string类型的value,并指定此键值对应的有效期。

例如:setexhaircolor 10 red

mset

一次设置多个key的值,成功返回ok表示所有的值都设置了,失败返回0表示没有任何值被设置。

例:mset key1lijie1 key2 lijie2

msetnx

get

获取key对应的string值,如果key不存在返回nil

getset

设置key的值,并返回key的旧值。

getrange

例:getrange name 0 5

mget

incr

对某一个key的值递增。

例: incr key1

incrby

incr类似,加指定值,key不存在时候会设置key,并认为原来的value0.

例:incrby key1 5

decr

对某一个key的值递减。

decrby

append

给指定key的字符串追加value,返回新字符串的长度。

strlen

取指定keyvalue值的长度。

hashes类型


 

Redis hash 是一个string类型的fieldvalue的映射表。他的添加、删除操作是o(1)(平均)hash特别适合用于存储对象。相较于对象的每个字段存成单个string类型。将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象。

hset

设置hash field为指定值,如果key不存在,则先创建。

hsetnx

hmset

hget

hmget

hincrby

hexists

测试指定field是否存在。

hlen

返回指定hashfield数量。

hdel

删除指定hashfield

hkeys

返回hash的所有field.

hvals

返回hash的所有value

hgetall

获取某个hash中全部的fieldvalue

list类型

List是一个链表结构,主要功能是pushpop、获取一个范围的所有值等,操作中key理解为链表的名字。Redislist类型其实就是一个每个子元素都是string类型的双向链表。可以通过pushpop操作链表的头部或尾部添加删除元素,这样list既可以作为栈,又可以作为队列。

lpush

key对应的list的头部添加字符串元素。

rpush

key对应list的尾部添加字符串元素。

linsert

key对应list的特定位置前或后添加字符串。

例:linsert list3 before one three

lset

设置list中指定下标的元素值。

例:lset list1 0 “world”

lrem

key对应list中删除n个和value相同的元素。

ltrim

保留指定key的值范围内的数据。

例:ltrim list1 1 -1

lpop

list的头部删除元素,并返回删除元素。

例:lpop list1

rpop

list的尾部删除元素,并返回删除元素。

例:rpop list1

rpoplpush

从第一个list的尾部移除元素并添加到第二个list的头部。

例:rpoplpush list1 list2

lindex

返回名称为keylistindex位置的元素。

llen

返回key对应list的长度。

set类型


 

Set是集合,他是string类型的无序集合。Set是通过hashtable实现的,添加、删除和查找的复杂度都是O(1)。对集合可以取并集、交集、差集。通过这些操作可以实现好友推荐和blogtag功能。

sadd

向名称为keyset中添加元素。

smembers

查看名称为keyset的元素。

srem

删除名称为keyset中的元素。

spop

随机返回并删除名称为keyset中一个元素。

sdiff

返回所有给定key与第一个key的差集。

sdiffstore

返回所给定key与第一个key的差集,并将结果存为另一个key.

例:sdiffstore set1 set2 set3

sinter

返回所有给定key的交集。

sinterstore

返回所给定key的交集,并将结果存为另一个key.

sunion

返回所有给定key的并集。

sunionstore

返回所有给定key的并集,并存为另一个key

smove

从第一个key对应的set中移除member并添加到第二个对应的set中。

例:smove set1 set2 “aaa”

scard

返回名称为keyset的元素的个数。

sismember

测试member是否是名称为keyset的元素。

srandmember

随机返回名称为keyset的一个元素,但不删除元素。


 

sorted set类型

sorted setset的一个升级版本,它在set的基础上增加了一个顺序属性,这一属性在修改元素时可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解为有两列mysql表,一列存value,一列存顺序。操作中key理解为zset的名字。

zadd

向名称为keyzset中添加元素member,score用于排序。如果该元素存在,则更新期顺序。

例:zadd zset1 1 “one”

zrange

key中取值。

例:zrange set1 0  -1 withscores

zrem

删除名称为keyzset中的元素的member.

zincrby

如果在名称为keyzset中已经存在元素member,则该元素的score增加increment否则向该集合中添加该元素,其score的值为increment

例:zincrby zset1 2 “one”

zrank

返回名称为keyzset中指定值的索引。

zrevrank

返回名称为keyzsetmember元素的排名(按score从大到小排序)即下标。

zrevrange

zrangebyscore

zcount

返回集合中score在给定区间的数量。

例:zcount zset1 2 3

zcard

返回集合中元素个数。

zremrangebyrank

删除集合中排名在给定区间的元素。

例:zremtangebyrank zset1 1 1

zremrangebyscore


 

redis常用命令

keys

返回满足给定pattern的所有key

用表达式*,代表取出所有的key

exists

确认一个key是否存在

del

删除一个key

expire

设置一个key的过期时间

例:expire  addr 10

ttl

查看一个key的有效时长。

move

将当前数据库中的key转移到其它数据库中。

persist

移除给定key的过期时间。

randomkey

随机返回key空间的一个key

rename

type

返回key的类型。

ping

测试连接是否存活。

echo

在命令行打印一些数据。

select

选择数据库。Redis数据库编号从0-15

quit

退出连接。

dbsize

返回当前数据库中key的数目。

info

config get

实时传储收到的请求。

例:config get dir

flushdb

删除当前选择数据库中所有key.

flushall

删除所有数据库中的所有key

Redis高级实用特性

1.      安全性

设置客户端连接后进行任何其他指定前需要使用的密码。

警告:因为redis速度相当快,所有在一台比较好的服务器下,一个外部的用户可以在一秒钟进行150k次密码尝试,这意味着需要指定非常强大的密码来防止暴力破解。

#requirepassfoobared

requirepassddd

客户端:auth ‘’     授权

登录客户端时指定口令:

/usr/local/redis/bin/redis-cli–a ddd

2.主从复制

Redis主从复制配置和使用非常简单。通过主从复制可以允许多个slave server拥有和masterserver相同的数据库副本。

Redis主从复制特点:

1master可以拥有多个slave

2)多个slave可以连接同一个master外,还可以连接到其它slave

3)主从复制不会阻塞master,在同步数据时,master可以继续处理client请求。

4)提高系统的伸缩性。

Redis主从复制过程:

1slavemaster建立连接,发送sync同步命令。

2master会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存。

3)后台完成保存后,就将此文件发送给slave

4slave将此文件保存到硬盘上。

配置主从服务器:

配置slave服务器很简单,只需要在slave的配置文件中加入以下配置:

slaveof 192.168.177.1 6379   #指定masterIP和端口

masterauth  aaa      #这是主机的密码


 

3.事务处理


 

Redis对事务的支持目前还比较简单。Redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其它client的命令。当一个client在一个连接中发出multi命令时,这个连接会进入一个事务上下文,该连接后续的命令不会立即执行,而是先放在一个队列中,当执行exec命令时,redis会顺序的执行队列中的所有命令。


 

1.      持久化机制

snapshotting

快照是默认的持久化方式。这种方式是将内存中的数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久化的方式。可以配置redisn秒内如果mkey被修改就自动做快照。

Save 9001  #900秒内如果超过1key被修改,则发起快照保存

aof

由于快照方式是在一定间隔时间做一次的,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。

aof比快照方式有更好的持久性,是由于在使用aof时,redis会将每一个收到的写命令都通过write函数追加到文件中,当redis重启时会通过重新执行文件中保存的写命令来子啊内存中重建整个数据库内容。

当然由于OS会在内核中缓存write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。

可以通过配置文件告诉redis我们想要通过fsync函数强制OS写入到磁盘的时机。


 

appendonlyyes  //启用aof持久化方式

#appendfsyncalways  //收到写命令就立即写入磁盘,最慢,但是保证完全的持久化

appendfsynceverysec   //每秒钟写入磁盘一次,在性能和持久化方面做了很好的折中

#appendfsyncno   //完全依赖OS,性能最好,持久化没保证


 

5.发布订阅消息


 

发布订阅(pub/sub)是一种消息通信模式,主要的目的是解除消息发布者和消息订阅者之间的耦合,redis作为一个pub/subserver,在订阅者和发布者之间起到了消息路由的功能。订阅者可以通过subscribepsubscribe命令向redisserver订阅自己感兴趣的消息类型,redis将信息类型称为通道(channel)。当发布者通过publish命令向redis server发送特定类型的信息时,订阅该信息类型的全部client都会受到此消息。


6.虚拟内存的使用


 

Redis的虚拟内存与操作系统的虚拟内存不是一回事,但是思路和目的都是相同的。就是暂时把不经常访问的数据从内存交换到磁盘中,从而腾出宝贵的内存空间用于其他需要访问的数据。尤其是对于redis这样的内存数据库,内存总是不够用。除了可以将数据分割到多个redis server外。另外能够提高数据库容量的办法就是使用虚拟内存把那些不经常访问的数据交换到磁盘上。


 

下面是vm相关配置:

vm-enabledyes                #开启vm功能

vm-swap-file/tmp/redis.swap    #交换出来的value保存的文件路劲

vm-max-memory1000000      #redis使用的最大内存上限

vm-page-size32              #每个页面的大小32个字节

vm-pages  13421           #最多使用多少页面

vm-max-threads4            #用于执行value对象换入的工作线程数量


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存